#include <iostream>
#include <unistd.h>
#include <pthread.h>
#include <vector>
using namespace std;

#define NUM 5

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int tickets = 1000;
bool ready = true;
void* SanpUpTichets(void* args)
{
    
    while(true)
    {
        
        pthread_mutex_lock(&mutex);     
        if(ready) pthread_cond_wait(&cond,&mutex);
        ready = false;
        if(tickets > 0)
        {
            cout << "pthread: " <<(int64_t) args << " tickets: " << tickets << endl;
            tickets--;
        }
        else 
        {
            pthread_mutex_unlock(&mutex);
            break;
        }   
        pthread_mutex_unlock(&mutex);
        ready = true;

    }
}

void* notice(void* args)
{
    while(true)
    {
        if(ready) pthread_cond_signal(&cond);
        usleep(20);
    }
}

int main()
{
    pthread_t n_tid;
    vector<pthread_t> tids;
    pthread_create(&n_tid,nullptr,notice,nullptr);
    for(int i = 0 ; i < NUM ; i++)
    {
        pthread_t tid;
        void* n = (void*)i;
        pthread_create(&tid,nullptr,SanpUpTichets,n);  
        tids.push_back(tid);   
    }

    pthread_cond_signal(&cond); 

    for(int i = 0; i < tids.size(); i++)
    {
        pthread_join(tids[i],nullptr);
    }

    sleep(10);

    return 0;
}












// void* SanpUpTichets(void* args)
// {
//     pthread_detach(pthread_self());
    
//     while(true)
//     {
//         pthread_mutex_lock(&mutex);
//         if(tickets > 0)
//         {
//             cout << "pthread: " <<(int64_t) args << " tickets: " << tickets << endl;
//             tickets--;   
//         }
//         else 
//         {
//             pthread_mutex_unlock(&mutex);
//             break;
//         }
//         pthread_mutex_unlock(&mutex);
//         //usleep(20);
        
//     }
//     return nullptr;
// }

// int main()
// {
//     for(int i = 0 ; i < NUM ; i++)
//     {
//         pthread_t tid;
//         void* n = (void*)i;
//         pthread_create(&tid,nullptr,SanpUpTichets,n);     
//     }

//     sleep(10);

//     return 0;
// }